#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <string>
#include <cstdio>
#include <cstring>
#include <vector>

// 创建多线程

const int num = 10;

void *routine(void *args)
{
    sleep(1);
    std::string name = static_cast<const char *>(args);
    delete (char*)args;
    int cnt = 5;
    while (cnt--)
    {
        std::cout << "new thread: " << name << std::endl;
        sleep(1);
    }

    return nullptr;
}

int main()
{
    std::vector<pthread_t> tids;
    for (int i = 0; i < num; i++)
    {
        pthread_t tid;
        //bug，引发线程安全，id会被覆盖，导致线程名不正确
        //char id[64];
        char* id = new char[64];//routine的args是一个拷贝，自己创建临时空间，不影响
        snprintf(id, 64, "thread-%d", i);
        int n = pthread_create(&tid, nullptr, routine, id);
        if (n == 0)
            tids.push_back(tid);

        //sleep(1);
    }

    for (int i = 0; i < num; i++)
    {
        int n = pthread_join(tids[i], nullptr);
        if (n == 0)
        {
            std::cout << "wait thread success" << std::endl;
        }
    }

    return 0;
}

// //1.main函数结束，代表主线程结束，一般也代表进程结束。
// //2.新线程对应入口函数，运行结束，代表当前线程运行结束。
// //3.参数和返回值可以是任意类型
// class Task
// {
// public:
//     Task(int a, int b) : _a(a), _b(b) {}
//     int Execute()
//     {
//         return _a + _b;
//     }
//     ~Task() {}

// private:
//     int _a;
//     int _b;
// };

// class Result
// {
// public:
//     Result(int result) : _result(result)
//     {
//     }
//     int GetResult() { return _result; }
//     ~Result() {}

// private:
//     int _result;
// };

// //线程终止的问题
// //1.return就是线程终止
// //注意：线程不能用exit函数退出，因为exit函数会导致整个进程退出
// //2.pthread_exit函数可以退出线程
// //3.
// void *routine(void *args)
// {
//     pthread_detach(pthread_self());
//     std::cout << "新线程被分离" << std::endl;
//     int cnt = 5;
//     while (cnt--)
//     {
//         std::cout << "new thread: " <<std::endl;
//         sleep(1);
//     }

//     return nullptr;
//     // Task *t = static_cast<Task *>(args);
//     // sleep(1);
//     // Result *res = new Result(t->Execute());
//     // sleep(1);
//     // //return res;
//     // pthread_exit(res);
//     // printf("hahaha, thread exit\n");

//     // std::string name = static_cast<const char *>(args);
//     // int cnt = 10;
//     // while (cnt)
//     // {
//     //     std::cout << name << ": " << cnt << std::endl;
//     //     cnt--;
//     //     sleep(1);
//     // }
//     // return (void *)10;
// }

// int main()
// {
//     pthread_t tid;
//     //Task *t = new Task(10, 20);
//     // pthread_create(&tid, nullptr, routine, (void *)"thread-1");
//     pthread_create(&tid, nullptr, routine, (void*)"thread-1");

//     // pthread_detach(tid);
//     // std::cout << "新线程被分离"<<std::endl;

//     int cnt = 5;
//     while (cnt--)
//     {
//         std::cout << "main thread: " << (long long)cnt << std::endl;
//         sleep(1);
//     }

//     int n = pthread_join(tid, nullptr);
//     if(n!=0)
//     {
//         std::cout<<"pthread_join error" << strerror(n) << std::endl;
//     }
//     else
//     {
//         std::cout<<"pthread_join success" << std::endl;
//     }

//     // Result *ret = nullptr;
//     // pthread_join(tid, (void **)&ret);
//     // int n = ret->GetResult();
//     // std::cout << "thread 运行结果 " << n << std::endl;
//     // delete t;
//     // delete ret;

//     return 0;
// }